/**
 * QuebraLink - Quebrador de links que tem protetor Copyright (C) 2011 Ranis
 * <ranishot@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 *
 *
 * Classe GUI
 *
 * Esta Classe define todo GUI do Projeto QuebraLink
 *
 * @package QuebraLink @name QuebraLink.java
 *
 * @author	Ranishot <ranishot@gmail.com> @copyright (C)2010 - 2011 Ranishot
 * @contributors Rodrigo Borges <rodrigo@rbmsoft.com.br> @license GNU GPL v3
 * @version 3.5
 * @since 09/06/2011
 */
package quebralink;

import com.sun.awt.AWTUtilities;
import java.awt.*;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.net.InetAddress;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

class GUIQuebraLink implements Runnable {
    //@TODO mudar painel do feed para grid layout

    public static final String VERSAO = "4.0 beta release não oficial";
    private File file;
    private ToolsMenu toolsMenu;
    private SendMail mail;
    private FileOutputStream fileOut;
    private FileInputStream fileIn;
    private DataOutputStream datOut;
    private DataInputStream datIn;
    private boolean loaded = false;
    private Thread vigiaCB;
    private String linkOrig;
    private static int cont = 1;
    private LookAndFeelInfo[] looks = UIManager.getInstalledLookAndFeels();
    private JRadioButton radio[] = new JRadioButton[looks.length];
    private ButtonGroup bGroup = new ButtonGroup();
    private ImageIcon iconeFrame;
    private JFrame frame;
    private JButton botao1;
    private JButton botao2;
    private JButton botao3;
    private JButton botao4;
    private PainelGBL painel1;
    private ButtonGroup radioGroup;
    private JPanel painel1_5;
    private JPanel painel2;
    private JPanel painel3;
    private JLabel label1;
    private JLabel label2;
    private JLabel label3;
    private JLabel loading;
    private JTextField campo1;
    private JTextField campo2;
    private JMenuBar barraMenu;
    private JMenu quebralink;
    private JMenu menu;
    private JMenu estiloGUI;
    private JMenu ferramentas;
    private JRadioButtonMenuItem[] itensEstiloGUI = new JRadioButtonMenuItem[looks.length];
    private JMenuItem sobre;
    private JMenuItem ajuda;
    private JMenuItem sair;
    private JMenuItem atualizar;
    private JCheckBoxMenuItem clipBoard;
    private JCheckBoxMenuItem everVisible;
    private JMenuItem atomicConfig;
    private boolean wind = false;
    public static boolean isBroken = true;

    //==============================================================================
    public void initGUI() {
        System.out.println("Iniciando interface  gráfica..");
        GuiQL();
    }

    private void GuiQL() {
        try {
            //carrega configurações
            loaded = loadConfigFile();

        } catch (FileNotFoundException ex) {
            System.err.println("Erro, arquivo não encontrado.");
        }
        vigiaCB = new Thread(this);//constroi a thread que vai ficar de olho no clip board
        iconeFrame = new ImageIcon(getClass().getResource("logo2.png"));
        frame = new JFrame("Quebra Link v " + VERSAO);
        frame.setIconImage(iconeFrame.getImage());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(false);
        frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(27, 0), "fireDoFindNext");
        frame.getRootPane().getActionMap().put("fireDoFindNext", new AbstractAction("fireDoFindNext") {
            // The next two lines should be in one line

            public void actionPerformed(ActionEvent e) {
                closeApp();
            }
        });

        //-------------------------------------------------------------------------
        //JMenuBar
        barraMenu = new JMenuBar();
        quebralink = new JMenu("QuebraLink");
        quebralink.setMnemonic('q');
        menu = new JMenu("Ajuda");
        menu.setMnemonic('a');
        ferramentas = new JMenu("Ferramentas");
        ferramentas.setMnemonic('f');
        sair = new JMenuItem("Sair");
        sair.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                closeApp();
            }
        });
        atualizar = new JMenuItem("Verificar atualizações");
        atualizar.setToolTipText("Verifica se existe uma versão mais recente do aplicativo");
        atualizar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                boolean isLatest;
                try {
                    System.out.println("Versão atual [ " + VERSAO + " ], verificando atualizações..");
                    isLatest = UpdateCheck.checkVersion(VERSAO);
                    System.out.println(isLatest ? "Atualização encontrada.." : "Não foi encontrado atualizações..");
                } catch (IOException ex) {
                    isLatest = true;
                    JOptionPane.showMessageDialog(frame, "Erro ao atualizar, verifique sua conexão com a internet.");
                }
                if (!isLatest) {
                    JOptionPane.showMessageDialog(frame, "Parabéns, você possui a versão mais recente do Quebra Link", "Atualização", JOptionPane.PLAIN_MESSAGE);
                }
            }
        });
        sobre = new JMenuItem("Sobre");
        sobre.setToolTipText("Exibe informações sobre o software");
        sobre.addActionListener(new SobreGUI());
        ajuda = new JMenuItem("Ajuda online");
        ajuda.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.out.println("Brownsing http://code.google.com/p/quebra-link/issues/entry?template=Defect%20report%20from%20user");
                irURL("http://code.google.com/p/quebra-link/issues/entry?template=Defect%20report%20from%20user");
            }
        });
        clipBoard = new JCheckBoxMenuItem("Capturar link");
        clipBoard.setToolTipText("Captura o link automaticamente ao você copiá-lo");
        clipBoard.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (clipBoard.isSelected()) {
                    toolsMenu.toolSeletions[0].setSelected(true);
                } else {
                    toolsMenu.toolSeletions[0].setSelected(false);
                }
            }
        });
        try {
            if (loaded) {
                boolean isSelected = datIn.readBoolean();
                clipBoard.setSelected(isSelected);
                System.out.println("Set flag getClipboard = {" + isSelected + "}");
            }
        } catch (IOException ex) {
            Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
        }
        everVisible = new JCheckBoxMenuItem("Sempre visível");
        everVisible.setToolTipText("A janela fica sempre visível");
        try {
            if (loaded) {
                boolean isSelected = datIn.readBoolean();
                everVisible.setSelected(isSelected);
                System.out.println("Set flag everVisiblez = {" + isSelected + "}");
                if (isSelected) {
                    frame.setAlwaysOnTop(true);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
        }
        everVisible.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (everVisible.isSelected()) {
                    frame.setAlwaysOnTop(true);
                } else {
                    frame.setAlwaysOnTop(false);
                }
            }
        });

        atomicConfig = new JMenuItem();
        atomicConfig.setText("Operação automática");
        atomicConfig.setToolTipText("Trata toda operação como atômica, ou seja como uma só");
        atomicConfig.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                toolsMenu.showInterface();
            }
        });

        quebralink.add(atualizar);
        quebralink.add(sair);
        menu.add(ajuda);
        menu.add(sobre);
        ferramentas.add(clipBoard);
        ferramentas.add(everVisible);
        ferramentas.add(atomicConfig);

        System.out.println("Loaded menu bar");

        //-------------------------------------------------------------------------
        //Painel com os botões!

        painel1 = new PainelGBL(2, 5, 2, 5);


        botao1 = new JButton("Quebrar Link");
        botao1.addActionListener(new BotaoEnviar());

        botao2 = new JButton("Limpar");

        botao2.addActionListener(new BotaoLimpar());


        botao3 = new JButton("Copiar");

        botao3.addActionListener(new BotaoCopiar());
        botao3.setEnabled(false);

        botao4 = new JButton("Download");
        botao4.addActionListener(new Download());


        botao4.setEnabled(false);

        painel1.addComponent(botao1, 0, 0, 1, 1, painel1.horizontal);
        painel1.addComponent(botao2, 1, 0, 1, 1, painel1.horizontal);
        painel1.addComponent(botao3, 2, 0, 1, 1, painel1.horizontal);
        painel1.addComponent(botao4, 3, 0, 1, 1, painel1.horizontal);

        painel1_5 = new JPanel(new BorderLayout());
        painel1_5.add(BorderLayout.NORTH, painel1);
        // Add painel a moldura
        frame.add(BorderLayout.EAST, painel1_5);

//==================================================================================

        estiloGUI = new JMenu("Estilo da GUI");
        radioGroup = new ButtonGroup();


        for (int i = 0; i < looks.length; i++) {
            itensEstiloGUI[i] = new JRadioButtonMenuItem(looks[i].getName());
            itensEstiloGUI[i].addActionListener(new SkinGUI());
            estiloGUI.add(itensEstiloGUI[i]);
            radioGroup.add(itensEstiloGUI[i]);

        }

        barraMenu.add(quebralink);
        barraMenu.add(ferramentas);
        barraMenu.add(estiloGUI);
        barraMenu.add(menu);
        frame.setJMenuBar(barraMenu);


        if (loaded) {
            try {
                int tmp = Integer.parseInt(readFile());
                itensEstiloGUI[tmp].setSelected(true);
                atualiza(tmp);

                System.out.println("Set flag GUILookAndFell = {" + looks[tmp].getClassName() + "}");
            } catch (IOException ex) {
                itensEstiloGUI[1].setSelected(true);
                System.out.println("Erro ao ler o arquivo.");
                ex.printStackTrace();
                atualiza(1);
            }
        } else {
            itensEstiloGUI[1].setSelected(true);
            atualiza(1);
        }

//-------------------------------------------------------------------------
        // cria menu de ferramentas para operações atomicas
        // invoca o método que cria a interface
        toolsMenu = new ToolsMenu();
        toolsMenu.createInterface();
//==================================================================================

        //-------------------------------------------------------------------------
        //Painel central para labels e JtextFields

        painel2 = new JPanel();

        label1 = new JLabel("Insira o Link a ser quebrado");
        Font fonte = new Font("serif", Font.BOLD, 14);
        label1.setFont(fonte);
        label1.setHorizontalAlignment(SwingConstants.CENTER);

        label2 = new JLabel("Link Quebrado");
        label2.setFont(fonte);
        label2.setHorizontalAlignment(SwingConstants.CENTER);

        Icon img = new ImageIcon(getClass().getResource("img.png"));
        label3 = new JLabel("By Ranishot");
        label3.setIcon(img);
        label3.setToolTipText("software developer");
        label3.setHorizontalAlignment(SwingConstants.CENTER);
//================================================================================

        campo1 = new JTextField(20);

        campo1.addActionListener(new Quebrar());

        campo2 = new JTextField(20);

        campo2.getDocument().addDocumentListener(new DocumentListener() {

            public void insertUpdate(DocumentEvent e) {
                botao3.setEnabled(true);
                botao4.setEnabled(true);
            }

            public void removeUpdate(DocumentEvent e) {
                String text = campo2.getText();
                if (text.length() < 1) {
                    botao3.setEnabled(false);
                    botao4.setEnabled(false);
                }
            }

            public void changedUpdate(DocumentEvent e) {
            }
        });

        System.out.println("Loaded listeners..");
        painel2.add(label1);
        painel2.add(campo1);
        painel2.add(label2);
        painel2.add(campo2);
        painel2.add(label3);

        System.out.println("Loaded all components..");

        frame.add(BorderLayout.CENTER, painel2);
        frame.setBounds(430, 250, 400, 300);
        frame.setVisible(true);

        System.out.println("Starting monitors Thead..");
        vigiaCB.start();//inicia a thread que vigia o clip board;
        System.out.println("monitors Thread started");
        closefiles();//fecha o fluxo de entrada

    }
//------------------------------------------------------------------------------
// Classes internas

    private class BotaoEnviar implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            /*
             * @TODO lembrar de colocar o painel de botões em uma thread própia
             * para ele poder atualizar sem ter que esperar o programa terminar
             * de quebrar o link! Por enquanto deixa só o cursor diferente
             * mesmo, na próxima versão isso será implementado
             */

            frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
            QuebraLink ql = new QuebraLink();

            String linkQuebrado = "";
            try {
                linkQuebrado = ql.quebraLink(campo1.getText());
                if (toolsMenu.isCopyLink) {
                    ClipBoardUtil.copyToClipBoard(linkQuebrado);
                }
                if (toolsMenu.isGoURL) {
                    irURL(linkQuebrado);
                }

            } catch (StringIndexOutOfBoundsException ex) {
                if (toolsMenu.isCopyLink) {
                    ClipBoardUtil.copyToClipBoard("Desculpe o link não pode ser quebrado.");
                    if (toolsMenu.isGoURL) {
                        irURL(linkQuebrado);
                    }
                }
                linkQuebrado = "Desculpe o link não pode ser quebrado.";
                isBroken = false;

            } catch (NullPointerException ex) {
                if (toolsMenu.isCopyLink) {
                    ClipBoardUtil.copyToClipBoard("Desculpe o link não pode ser quebrado.");
                    if (toolsMenu.isGoURL) {
                        irURL(linkQuebrado);
                    }
                }
                linkQuebrado = "Desculpe o link não pode ser quebrado.";
                isBroken = false;
            } finally {
                if (!isBroken) {
                    JOptionPane.showMessageDialog(frame, "O seu link não pode ser quebrado\n ele será enviado para analise", "Link não quebrado", JOptionPane.WARNING_MESSAGE);
                    sendReporting(campo1.getText());
                    isBroken = true;
                }
            }
            campo2.setText(linkQuebrado);
            frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

            linkOrig = campo1.getText();
            campo1.setText("");
            campo1.requestFocus();

            cont++;
            Runtime.getRuntime().gc();
        }
    }

    private class BotaoLimpar implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            campo1.setText("");
            campo2.setText("");
            campo1.requestFocus();
            cont = 3;
        }
    }

    private class BotaoCopiar implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            campo2.selectAll();
            campo2.copy();
        }
    }

    private class Quebrar implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            BotaoEnviar a = new BotaoEnviar();
            a.actionPerformed(e);
        }
    }

    private class Download implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            irURL(campo2.getText());


        }
    }

    private class SkinGUI implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < itensEstiloGUI.length; i++) {
                if (itensEstiloGUI[i].isSelected()) {
                    atualiza(i);
                }
            }
        }
    }

    private void atualiza(int i) {
        try {
            UIManager.setLookAndFeel(looks[i].getClassName());
            SwingUtilities.updateComponentTreeUI(frame);


        } catch (ClassNotFoundException ex) {
            Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void irURL(String URL) {
        if(URL.contains("não pode ser quebrado."))return;
        String text, text2;
        text = System.getProperty("os.name");
        text = text.toLowerCase();
        text2 = URL;

        if (text.contains("linux") && !text2.equals("")) {
            try {
                Runtime.getRuntime().exec("firefox " + URL);
            } catch (IOException ex) {
                System.out.println("navegador não instalado");
            }
        } else if (text.contains("windows") && !text2.equals("")) {
            try {
                Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + URL);
            } catch (IOException ex) {
                System.out.println("Desculpe,falha na execução dessa função!");
            }
        }


    }

    public void changeGUI() {
        if (frame.isVisible()) {
            this.frame.setVisible(false);
        } else {
            this.frame.setVisible(true);
        }
    }

    public boolean frameIsVisible() {
        if (this.frame.isVisible()) {
            return true;
        } else {
            return false;
        }
    }

    public JFrame getFrame() {
        return this.frame;
    }

    class SobreGUI implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            //@TODO organizar essa parte está desorganizada!

            final JDialog NJanela = new JDialog(frame, "Sobre", true);
            JButton fechaSplash;
            final JLabel linkSite;
            JLabel label1;
            JLabel label2;
            JLabel label3;

            linkSite = new JLabel("Site do projeto");
            linkSite.setCursor(new Cursor(Cursor.HAND_CURSOR));
            linkSite.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseEntered(MouseEvent e) {
                    linkSite.setForeground(Color.red);
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    linkSite.setForeground(Color.BLACK);
                }

                @Override
                public void mouseClicked(MouseEvent e) {
                    irURL("http://code.google.com/p/quebra-link/");
                }
            });
            NJanela.setResizable(false);

            fechaSplash = new JButton("Fechar");
            fechaSplash.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    NJanela.dispose();
                }
            });
            label1 = new JLabel(new ImageIcon(getClass().getResource("Bola_corrente.png")));
            JPanel panelSplash = new JPanel(new FlowLayout(FlowLayout.LEFT, 15, 3));
            JPanel centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 4));
            centerPanel.add(label1);
            panelSplash.add(fechaSplash);
            panelSplash.add(new JLabel("                         "));
            panelSplash.add(linkSite);
            NJanela.getRootPane().setDefaultButton(fechaSplash);
            NJanela.add(centerPanel);
            NJanela.add(panelSplash, BorderLayout.SOUTH);
            NJanela.add(centerPanel, BorderLayout.CENTER);
            NJanela.setLocation(frame.getX() + 30, frame.getY() + 20);
            NJanela.setSize(350, 330);
            NJanela.setVisible(true);
        }
    }

    public void run() {
        while (true) {
            try {

                String olderClipBoard = null;

                while (true) {

                    if (clipBoard.isSelected()) {
                        if ((ClipBoardUtil.getClipboard() != null) && ClipBoardUtil.getClipboard().startsWith("http://") && !ClipBoardUtil.getClipboard().equalsIgnoreCase(olderClipBoard)) {

                            olderClipBoard = ClipBoardUtil.getClipboard();
                            campo1.setText(ClipBoardUtil.getClipboard());

                            if (!toolsMenu.isBrokenLink && !frame.isFocused()) {
                                if (frame.getState() == JFrame.ICONIFIED) {
                                    frame.setExtendedState(JFrame.NORMAL);
                                }
                                frame.requestFocus();
                                frame.setVisible(true);
                            }

                            if (toolsMenu.isBrokenLink) {
                                String tmp = new QuebraLink().quebraLink(olderClipBoard);
                                campo2.setText(tmp);
                                if (toolsMenu.isCopyLink) {
                                    ClipBoardUtil.copyToClipBoard(tmp);
                                }
                                if (toolsMenu.isGoURL) {
                                    irURL(tmp);
                                }
                            }
                        }
                        olderClipBoard = ClipBoardUtil.getClipboard();
                    }
                    Thread.sleep(700);
                }

            } catch (UnsupportedFlavorException ex) {
                System.out.println("Sem dados a analizar.");
            } catch (IOException ex) {
                System.out.println("Sem dados a analizar.");
            } catch (InterruptedException ex) {
                System.out.println("Sem dados a analizar.");
            }
        }
    }

    private void createConfigFile() throws FileNotFoundException {

        String text = System.getProperty("os.name");
        text = text.toLowerCase();
        if (text.contains("linux")) {
            file = new File(".data.conf");
            System.out.println("Config file created in [" + file.getAbsolutePath() + "]");
        } else if (text.contains("windows")) {
            wind = true;
            file = new File("data.conf");
        }
        fileOut = new FileOutputStream(file);
        datOut = new DataOutputStream(fileOut);
    }

    private boolean loadConfigFile() throws FileNotFoundException {
        String text = System.getProperty("os.name");
        text = text.toLowerCase();
        if (text.contains("linux")) {
            file = new File(".data.conf");
        } else if (text.contains("windows")) {
            file = new File("data.conf");
        }
        if (file.exists()) {
            fileIn = new FileInputStream(file);
            datIn = new DataInputStream(fileIn);
            return true;
        } else {
            return false;
        }
    }

    private String readFile() throws IOException {
        try {
            String tmp = null;
            if ((tmp = datIn.readUTF()) != null) {
                return tmp;
            }
            return null;
        } catch (NullPointerException e) {
            return null;
        }
    }

    private void closefiles() {
        try {
            if (datIn != null) {
                datIn.close();
            }
            if (datOut != null) {
                datOut.close();
            }
        } catch (IOException e) {
            System.err.println("Erro ao fechar o arquivo");
        }
    }

    public void closeApp() {
        System.out.println("Closing quebra link..");
        try {
            createConfigFile();
            System.out.println("Writing config file..");

            // salva se a thread monitora do clipboard vai monitorar ou não
            datOut.writeBoolean(clipBoard.isSelected());
            // salva se a frame vai ficar sempre visivel ou não
            datOut.writeBoolean(everVisible.isSelected());

            String tmp = null;
            for (int i = 0; i < itensEstiloGUI.length; i++) {
                if (itensEstiloGUI[i].isSelected()) {
                    tmp = String.valueOf(i);
                    datOut.writeUTF(tmp);
                    break;
                }
            }

            // salve o checkbox responsável por marcar se vai ou não quebrar o link automatico
            datOut.writeBoolean(toolsMenu.isBrokenLink);

            // salve o checkbox responsável por marcar se vai copiar o link automatico

            datOut.writeBoolean(toolsMenu.isCopyLink);

            // salve o checkbox responsável por marcar se vai ou não abrir o link no navegador automaticamente
            datOut.writeBoolean(toolsMenu.isGoURL);

            System.out.println("Config file written");
        } catch (IOException ex) {
            System.err.println("Erro ao criar arquivo de configuração.");
        } finally {
            closefiles();//fecha o fluxo de saída
        }


        closefiles();//fecha o fluxo de saída
        if (wind) {
            System.out.println("Is windows, hidden config file");
            try {
                Runtime.getRuntime().exec("attrib -h .data.conf");
            } catch (IOException ex) {
                System.err.println("Erro ao deixar arquivo oculto.");
            }
        }
        System.out.println("Exited, bye :D");
        System.exit(0);
    }

    private void sendReporting(final String link) {
        new Thread(new Runnable() {

            public void run() {

                try {
                    linkOrig = link;
                    UpdateCheck.checkVersion(linkOrig, GUIQuebraLink.VERSAO);
                    String origem = InetAddress.getLocalHost().getHostName();
                    String destino = "ranishot@gmail.com", assunto = "Link quebrado de " + InetAddress.getLocalHost().getHostName() + " versão: " + GUIQuebraLink.VERSAO, menssagem = linkOrig;

                    mail = new SendMail();
                    mail.sendMail(origem, destino, assunto, menssagem);

                } catch (IOException ex) {
                    Logger.getLogger(QuebraLink.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }).start();
    }

    private class ToolsMenu extends JFrame {

        private JDialog atomicFrame;
        private GridLayout centerlayout;
        private JPanel painelNorte;
        private JPanel painelCentro;
        private JPanel painelSul;
        private JButton aplicar;
        private JButton cancelar;
        private JLabel menuTitle;
        private JLabel captLink;
        private JLabel quebrarLink;
        private JLabel copiarLink;
        private JLabel abrirLinkBrowser;
        private JCheckBox[] toolSeletions;
        private JPanel selectionPanel;
        private boolean isCopyLink;
        private boolean isGoURL;
        private boolean isBrokenLink;

        protected void createInterface() {
            atomicFrame = new JDialog(frame, "Operação atômica", true);
            centerlayout = new GridLayout(4, 1);
            centerlayout.setVgap(5);
            centerlayout.setHgap(20);

            painelCentro = new JPanel(centerlayout, true);
            painelNorte = new JPanel();
            painelSul = new JPanel();

            aplicar = new JButton("Aplicar");
            atomicFrame.getRootPane().setDefaultButton(aplicar);
            aplicar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    applyAction();
                }
            });

            cancelar = new JButton("Cancelar");
            cancelar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cancelAction();
                }
            });

            menuTitle = new JLabel("Operações atômicas");
            menuTitle.setToolTipText("Aqui se define as operações a serem realizadas em sequência");


            captLink = new JLabel("Capturar link");
            captLink.setToolTipText(null);

            quebrarLink = new JLabel("Quebrar link");
            quebrarLink.setToolTipText(null);

            copiarLink = new JLabel("Copiar link");
            copiarLink.setToolTipText(null);

            abrirLinkBrowser = new JLabel("Abrir link no navegador");
            abrirLinkBrowser.setToolTipText(null);

            toolSeletions = new JCheckBox[4];

            for (int i = 0; i < toolSeletions.length; i++) {
                toolSeletions[i] = new JCheckBox();
                toolSeletions[i].setHorizontalTextPosition(SwingConstants.LEFT);
                toolSeletions[i].setText("                              ");
                if (i == 0) {
                    continue;
                }
                toolSeletions[i].addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        if (!toolSeletions[0].isSelected()) {
                            clipBoard.setSelected(false);
                            for (int i = 0; i < toolSeletions.length; i++) {
                                toolSeletions[i].setSelected(false);
                            }
                            JOptionPane.showMessageDialog(frame, "Para essa opção funcionar, a opção \"Capturar link\" deve estar marcada.", "Seleção inválida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            }

            toolSeletions[0].addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    if (!toolSeletions[0].isSelected()) {
                        for (int i = 0; i < toolSeletions.length; i++) {
                            toolSeletions[i].setSelected(false);
                        }
                    }
                }
            });

            loadToolOptions();

            // Essa parte é para caso o opção de capturar o link não estiver marcada, ou ela for desmarcada,
            // todas as outras também serão

            if (clipBoard.isSelected()) {
                toolSeletions[0].setSelected(true);
            }

            atomicFrame.setLayout(new FlowLayout(FlowLayout.CENTER, 4, 30));
            atomicFrame.add(menuTitle, BorderLayout.NORTH);

            selectionPanel = new JPanel(centerlayout);
            selectionPanel.add(captLink);
            selectionPanel.add(toolSeletions[0]);
            selectionPanel.add(quebrarLink);
            selectionPanel.add(toolSeletions[1]);
            selectionPanel.add(copiarLink);
            selectionPanel.add(toolSeletions[2]);
            selectionPanel.add(abrirLinkBrowser);
            selectionPanel.add(toolSeletions[3]);

            atomicFrame.add(selectionPanel, BorderLayout.CENTER);
            atomicFrame.add(aplicar, BorderLayout.SOUTH);
            atomicFrame.add(cancelar, BorderLayout.SOUTH);

            atomicFrame.setLocation(frame.getX() + 30, frame.getY() + 20);
            atomicFrame.setSize(370, 300);
            atomicFrame.setResizable(false);

        }

        protected void resoluteAtomicOperation(JCheckBox[] boxes) {
            if (boxes[0].isSelected()) {
                clipBoard.setSelected(true);
            } else {
                clipBoard.setSelected(false);
                for (int i = 0; i < boxes.length; i++) {
                    boxes[i].setSelected(false);
                }
            }

            if (boxes[1].isSelected()) {
                if (!clipBoard.isSelected()) {
                    clipBoard.setSelected(true);
                    boxes[0].setEnabled(true);
                }
                isBrokenLink = true;
            } else {
                isBrokenLink = false;
            }

            if (boxes[2].isSelected()) {
                if (!clipBoard.isSelected()) {
                    clipBoard.setSelected(true);
                    boxes[0].setEnabled(true);
                }
                isCopyLink = true;
            } else {
                isCopyLink = false;
            }

            if (boxes[3].isSelected()) {
                if (!clipBoard.isSelected()) {
                    clipBoard.setSelected(true);
                    boxes[0].setEnabled(true);
                }
                isGoURL = true;
            } else {
                isGoURL = false;
            }

        }

        private void showInterface() {
            atomicFrame.setVisible(true);
        }

        private void hideInterface() {
            atomicFrame.dispose();
        }

        private void applyAction() {
            resoluteAtomicOperation(toolSeletions);
            hideInterface();
        }

        private void loadToolOptions() {
            try {
                if (loaded) {
                    boolean tmp = datIn.readBoolean();
                    System.out.println("Set flag isBrokenLink = {" + tmp + "}");
                    isBrokenLink = tmp;
                    toolSeletions[1].setSelected(tmp);
                    tmp = datIn.readBoolean();
                    System.out.println("Set flag  isCopyLink = {" + tmp + "}");
                    isCopyLink = tmp;
                    toolSeletions[2].setSelected(tmp);
                    tmp = datIn.readBoolean();
                    System.out.println("Set flag isGoUrl = {" + tmp + "}");
                    isGoURL = tmp;
                    toolSeletions[3].setSelected(tmp);

                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
                for (int i = 1; i < toolSeletions.length; i++) {
                    toolSeletions[i].setSelected(false);
                }
            }
        }

        private void cancelAction() {
            hideInterface();
        }
    }

    private class NoBrokenAlertInterface {

        private JFrame dialogWindows;

        public void initInterface() {
            try {
                createInterface();
            } catch (InterruptedException ex) {
                Logger.getLogger(GUIQuebraLink.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        private void createInterface() throws InterruptedException {

            dialogWindows = new JFrame();
            dialogWindows.setUndecorated(false);
            //AWTUtilities.setWindowOpacity(frame, 0.5f);

            Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
            dialogWindows.setBounds(0, 0, 300, 200);

            dialogWindows.setVisible(true);
            dialogWindows.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            boolean up = true;
            boolean down = false;
            boolean left = false;
            boolean right = false;
            while (true) {
                if (up) {
                    System.out.println("Indo para direita");
                    for (int i = dialogWindows.getX(); i < 1366; i++) {
                        dialogWindows.setLocation(i, dialogWindows.getY());
                        Thread.sleep(3);
                        up = false;
                        right = true;
                    }
                } else if (right) {
                    System.out.println("Indo para baixo");
                    for (int i = dialogWindows.getY(); i < 768; i++) {
                        dialogWindows.setLocation(dialogWindows.getX(), i);
                        Thread.sleep(5);
                    }
                    right = false;
                    down = true;
                } else if (down) {
                    System.out.println("Indo para esquerda");
                    for(int i = dialogWindows.getX(); i > 0; i--){
                        dialogWindows.setLocation(i, dialogWindows.getY());
                        Thread.sleep(5);
                    }
                    down = false;
                    left = true;
                } else if (left) {
                    System.out.println("Indo para cima");
                    for(int i = dialogWindows.getY(); i > 0; i--){
                        dialogWindows.setLocation(dialogWindows.getX(), i);
                        Thread.sleep(3);
                    }
                    left = false;
                    up = true;
                }
            }
        }
    }

    public void aaaaaaa() {
        new NoBrokenAlertInterface().initInterface();
    }

    public static void main(String[] args) {
        new GUIQuebraLink().aaaaaaa();
    }
}
